// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * A generic kernel FIFO implementation
 */
#ifndef _KFIFO_H_
#define _KFIFO_H_

#include "stdint.h"

typedef struct {
    uint32_t in;                /* 入队序号 */
    uint32_t out;               /* 出队序号 */
    uint32_t size;              /* FIFO大小 */
    uint8_t *data;              /* 数据缓存 */
}KFIFO;


/* 队列大小 */
#define kfifo_size(fifo)        ((fifo)->size + 1)
/* 队列数据长度 */
#define kfifo_len(fifo)         ((fifo)->in - (fifo)->out)
/* 队列剩余长度 */
#define kfifo_avail(fifo)       (kfifo_size(fifo) - kfifo_len(fifo))
/* 队列是否为空 */
#define kfifo_is_empty(fifo)    ((fifo)->in == (fifo)->out)
/* 队列是否已满 */
#define kfifo_is_full(fifo)     (kfifo_len(fifo) == kfifo_size(fifo))
/* 清空队列 */
#define kfifo_reset(fifo)       ((fifo)->in = (fifo)->out)

void kfifo_init(KFIFO *fifo, void *buffer, uint32_t size);
uint32_t kfifo_in(KFIFO *fifo, const void *src, int32_t len);
uint32_t kfifo_out(KFIFO *fifo, void *dst, int32_t len);
uint32_t kfifo_len_need(KFIFO *fifo, uint8_t byte);
uint32_t kfifo_put(KFIFO *fifo, uint8_t byte);
uint32_t kfifo_get(KFIFO *fifo, uint8_t *byte);


#endif
